﻿Module Modulo

    Public Mijuego As New Juego
    Public Jugador1 As New Jugador
    Public Jugador2 As New Jugador

    Public jugadoractual As New Jugador
    Public otrojugador As New Jugador
    Public miMapa As New Mapa

    'Tooltips para poner en las picturebox creadas
    Public mensajes As New List(Of ToolTip)

    'METODO PARA CAMBIAR EL JUGADOR ACTUAL ENTRE LOS DOS JUGADORES
    Public Sub CambiarJugador()
        If jugadoractual.Equals(Jugador1) Then
            jugadoractual = Jugador2
            otrojugador = Jugador1
        ElseIf jugadoractual.Equals(Jugador2) Then
            jugadoractual = Jugador1
            otrojugador = Jugador2
        End If

    End Sub

    'FUNCION PARA CALCULAR LA DISTANCIA
    Public Function CalcularAlcance(ByVal distanciaUnidad As Integer, ByVal posicionUnidad As Point, ByVal objetivo As Point) As Boolean
        If Math.Abs(objetivo.X + objetivo.Y - (posicionUnidad.X + posicionUnidad.Y)) <= distanciaUnidad Then
            Return True
        Else
            Return False

        End If
    End Function

    '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    '/////////////////////////////////////////////// FUNCIONES DE COMBATE /////////////////////////////////////////////////////////
    '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    'FUNCION QUE CALCULA LOS ATAQUES REALIZADOS CON EXITO
    Public Function Ataque(ByVal atacante As Batallon, ByVal defensor As Batallon) As Integer
        Dim dado As New Dado
        Dim heridas As Integer
        Dim ataquesconexito As Integer
        Dim resultados As Integer
        Dim daño As Integer
        For i As Integer = 0 To atacante.Tropas.Count - 1
            resultados = (atacante.Tropas(i).Atacar - defensor.Tropas(i).Defender)
            If resultados >= 0 Then
                ataquesconexito += 1
            End If
        Next
        For i As Integer = 0 To ataquesconexito
            For j As Integer = 0 To 3
                daño = atacante.Tropas(i).Fuerza + dado.lanzar
                If daño >= defensor.Tropas(i).Defensa Then
                    heridas += 1
                End If
            Next
        Next
        Return heridas
    End Function

    'FUNCION QUE CALCULA LOS ATAQUES A ESTRUCTURAS
    Public Function AtaqueAEstructura(ByVal atacante As Batallon, ByVal defensor As Estructura) As Integer
        Dim dado As New Dado
        Dim heridas As Integer
        Dim ataquesconexito As Integer
        Dim resultados As Integer
        Dim daño As Integer
        For i As Integer = 0 To atacante.Tropas.Count - 1
            resultados = (atacante.Tropas(i).Atacar - defensor.Defender)
            If resultados >= 0 Then
                ataquesconexito += 1
            End If
        Next
        For i As Integer = 0 To ataquesconexito
            For j As Integer = 0 To 3
                daño = atacante.Tropas(i).Fuerza + dado.lanzar
                If daño >= defensor.Defensa Then
                    heridas += 1
                End If
            Next
        Next
        Return heridas
    End Function

    'FUNCION QUE CALCULA EL ATAQUE DE LAS ESTRUCURAS
    'Public Function AtaqueDeEstructura(ByVal atacante As Estructura, ByVal defensor As Batallon, ) As Integer
    '    Dim dado As New Dado
    '    Dim heridas As Integer
    '    Dim ataquesconexito As Integer
    '    Dim resultados As Integer
    '    Dim daño As Integer
    '    For i As Integer = 0 To defensor.Tropas.Count - 1
    '        resultados = (atacante.Disparo - defensor.Tropas(i).Defensa)
    '        If resultados >= 0 Then
    '            ataquesconexito += 1
    '        End If
    '    Next
    '    For i As Integer = 0 To ataquesconexito
    '        For j As Integer = 0 To 3
    '            daño = atacante.Tropas(i).Fuerza + dado.lanzar
    '            If daño >= defensor.Defensa Then
    '                heridas += 1
    '            End If
    '        Next
    '    Next
    '    Return heridas
    'End Function

    'FUNCION QUE SIRVE PARA CALCULAR DISPAROS CON EXITO
    Public Function disparar(ByVal atacante As Batallon, ByVal defensor As Batallon) As Integer
        Dim resultado, heridas As Integer
        Dim dado As New Dado
        If atacante.Tipo.Equals(GetType(Arquero)) Then
            If CalcularAlcance(TryCast(atacante.Tropas(0), Arquero).Alcance, atacante.Localizacion, defensor.Localizacion) = True Then
                For Each arq In atacante.Tropas
                    resultado = TryCast(atacante.Tropas(0), Arquero).Disparo + dado.lanzar
                    If resultado >= defensor.Tropas(0).Defensa Then
                        heridas = heridas + 1
                    End If
                Next
            End If
        End If
        Return heridas
    End Function

    'FUNCION QUE ELIMINA TROPAS DEL BANDO DEFENSOR, SEGUN LAS HERIDAS RECIBIDAS
    Public Sub Eliminar(ByVal defensor As Batallon, ByVal heridas As Integer)
        For Each def In defensor.Tropas
            If def.Vida <= heridas Then
                defensor.Tropas.Remove(def)
                heridas = heridas - def.Vida
            End If
            def.Vida = def.Vida - heridas
            Exit Sub
            If heridas <= 0 Then
                Exit For
            End If
        Next
        If defensor.Tropas.Count <= 0 Then
            Moralidad(defensor, otrojugador)
            defensor = Nothing
        End If
    End Sub

    'FUNCION QUE CALCULA SI LAS UNIDADES EN TORNO A UNA UNIDAD ELIMINADA SUFREN UN PENALIZADOR POR DESMORALIZACION
    Public Sub Moralidad(ByVal unidad As Batallon, ByVal jugador As Jugador)
        Dim dado As New Dado
        Dim tirada As Integer = dado.lanzar
        For i As Integer = 0 To jugador.Batallones.Count - 1
            If CalcularAlcance(2, unidad.Localizacion, jugador.Batallones(i).Localizacion) Then
                If tirada > jugador.Batallones(i).Tropas(0).Disciplina Then
                    For Each t As UnidadBase In jugador.Batallones(i).Tropas
                        t.Ataque = t.Ataque - 1
                    Next
                End If
            End If
        Next
    End Sub

    '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    '/////////////////////////////////////////////// FUNCIONES DE HECHIZOS ////////////////////////////////////////////////////////
    '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    'BOLA DE FUEGO
    Public Sub LanzarBolaFuego(ByVal objetivo As Batallon, ByVal lanzador As Batallon)
        If lanzador.Tropas(0).GetType() = GetType(Mago) Or lanzador.Tropas(0).GetType() = GetType(Archimago) Then
            For Each b As Hechizo In TryCast(lanzador.Tropas(0), Mago).Hechizos
                If b.Nombre = "BolaFuego" Then
                    b.BolaFuego(objetivo, TryCast(lanzador.Tropas(0), Mago).Magia, lanzador.Localizacion)
                End If
            Next
        End If
    End Sub
    'DEBILIDAD
    Public Sub LanzarDebilidad(ByVal objetivo As Batallon, ByVal lanzador As Batallon)
        If lanzador.Tropas(0).GetType() = GetType(Mago) Or lanzador.Tropas(0).GetType() = GetType(Archimago) Then
            For Each b As Hechizo In TryCast(lanzador.Tropas(0), Mago).Hechizos
                If b.Nombre = "Debilidad" Then
                    b.Debilidad(objetivo, lanzador.Localizacion)
                End If
            Next
        End If
    End Sub
    'TELEPORTAR
    Public Sub LanzarTeleportar(ByVal nuevaposicion As Point, ByVal lanzador As Batallon)
        If lanzador.Tropas(0).GetType() = GetType(Archimago) Then
            For Each pos In Jugador1.Batallones
                If pos.Localizacion = nuevaposicion Then
                    Exit Sub
                End If
            Next
            For Each pos In Jugador2.Batallones
                If pos.Localizacion = nuevaposicion Then
                    Exit Sub
                End If
            Next
            For Each b As Hechizo In TryCast(lanzador.Tropas(0), Mago).Hechizos
                lanzador.Localizacion = b.Teleportar(lanzador.Localizacion, nuevaposicion)
            Next
        End If
    End Sub
    'METEORITO
    Public Sub LanzarMeteorito(ByVal objetivo As Batallon, ByVal lanzador As Batallon)
        If lanzador.Tropas(0).GetType() = GetType(Archimago) Then
            For Each b As Hechizo In TryCast(lanzador.Tropas(0), Mago).Hechizos
                If b.Nombre = "Meteorito" Then
                    b.Meteorito(objetivo, lanzador.Localizacion, TryCast(lanzador.Tropas(0), Mago).Magia)
                End If
            Next
        End If
    End Sub


    '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    '////////////////////////////////////////// CONSTRUCCIÓN DE LAS BASES //////////////////////////////////////////////////////////
    '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    Public Sub colocarBases()
        Dim rndY1, rndY2 As New Random
        Dim Y1, Y2 As Integer
        Do
            Y1 = rndY1.Next(miMapa.tamañoMapa)
        Loop While miMapa.diseñoMapa(5, Y1) = 1
        Do
            Y2 = rndY2.Next(miMapa.tamañoMapa)
        Loop While miMapa.diseñoMapa(45, Y2) = 1
        Jugador1.miEstructura.Coordenadas = New Point(5, Y1)
        Jugador1.miEstructura.Coordenadas = New Point(45, Y2)
    End Sub

    Public Sub calcularAccesoMovimiento(ByVal miBatallon As Batallon)
        For i As Integer = 0 To miMapa.tamañoMapa
            For j As Integer = 0 To miMapa.tamañoMapa
                If CalcularAlcance(miBatallon.Tropas(0).Velocidad, miBatallon.Localizacion, miMapa.casillasMapa(i, j).Coordenadas) & miMapa.casillasMapa(i, j).Accesible Then
                    'miMapa.casillasMapa(i, j).Pb.BackgroundImage = My.Resources.Accesible 'Poner imagen de resources
                ElseIf CalcularAlcance(miBatallon.Tropas(0).Velocidad, miBatallon.Localizacion, miMapa.casillasMapa(i, j).Coordenadas) & miMapa.casillasMapa(i, j).Accesible = False Then
                    'miMapa.casillasMapa(i, j).Pb.BackgroundImage = My.Resources.Inaccesible 'Poner imagen
                End If
            Next
        Next
    End Sub

    Public Sub MoverBatallon(ByVal miBatallon As Batallon, ByVal casillaSeleccionada As Casilla)
        If Lealtad(miBatallon) AndAlso CalcularAlcance(miBatallon.Tropas(0).Velocidad, miBatallon.Localizacion, casillaSeleccionada.Coordenadas) & casillaSeleccionada.Accesible Then
            miBatallon.Localizacion = casillaSeleccionada.Coordenadas
            For Each picbox In FormJuego.imgUnidades1
                If TryCast(picbox.Tag, Batallon).Equals(miBatallon) Then
                    picbox.Location = casillaSeleccionada.Coordenadas
                End If
            Next
        End If
    End Sub

    Public Function Lealtad(ByVal batallonSeleccionado As Batallon) As Boolean
        If jugadoractual.Batallones.Contains(batallonSeleccionado) Then
            Return True
        End If
        Return False
    End Function

    Public Sub Seleccionarunidad()

    End Sub

End Module
